#include "../include/Spl_list.h"

Elenemt_data data[4] = 
{
 { .name = "雨龙" , .password = "456"   },
 { .name = "白哉" , .password = "789"   },
 { .name = "蓝染" , .password = "123"   },
 { .name = "剑鬼" , .password = "123"   }
};

// 登陆的密码验证
Elenemt_data log_in(Double_Link_List *list_1, Double_Link_List *list_2)
{
    Elenemt_data log_data;
    Double_Node *ptr = NULL;
    memset(&log_data, 0, sizeof(log_data));
    if (NULL == list_1 || NULL == list_2)
    {
        ERRLOG("链表的动态空间为空");
        return log_data;
    }
    // 登陆次数控制
    int num = 3;

        // 用户输入账号以及密码
        printf("输入你的账号:");
        scanf("%s", log_data.name);
        printf("输入你的密码:");
        scanf("%s", log_data.password);

        if (NULL != (ptr = find_double_node_name(list_1, log_data.name)))
        {
            if (!strcmp(ptr->data.password, log_data.password))
            {
                printf("登陆成功\n");
                log_data = ptr->data;
                return log_data;
            }
        }
        if (NULL != (ptr = find_double_node_name(list_2, log_data.name)))
        {
            if (!strcmp(ptr->data.password, log_data.password))
            {
                printf("登陆成功\n");
                log_data = ptr->data;
                return log_data;
            }
        }
        num--;
        if (0 == num)
        {
            printf("三次输入错误 请稍后再试\n");
            exit(-1); // 退出进程
        }
}

// 注册
void reg(Double_Link_List *list)
{
    if (NULL == list)
    {
        ERRLOG("链表的动态空间为空");
        return ;
    }
    Elenemt_data log_data;
    char password[128];
    log_data.id = 0;
    printf("请输入你 账号:\n");
    scanf("%s" , log_data.name);

    printf("请输入你的密码:\n");
    scanf("%s" , log_data.password);

    printf("请再次输入你的密码:\n");
    scanf("%s" , password);
    
    if (strcmp(password , log_data.password))
    {
        printf("两次密码输入不相同 请重新运行本程序\n");
        exit(-1);
    }

    printf("恭喜你 注册成功\n");

    // 插入到链表
    
    insert_double_node(list , log_data , 1);

    // 写入到文件
    F_print( list , "2_dom_data.txt" );
}


void root_amend(Double_Link_List *list , char * name)
{
    if (NULL == list)
    {
        ERRLOG("链表的动态空间为空");
        return ;
    }

    Double_Node * ptr = find_double_node_name( list ,  name);
    int num = 0;
    char buf[128];
    printf("请输入你需要修改的信息 1 账号 2 密码 3 升级权限:\n");
    scanf("%d" , &num);

    switch (num)
    {
    case 1:
        printf("请输入你的账号");
        scanf("%s" , buf);
        strcpy( ptr->data.name ,  buf);
        printf("账号修改成功 账号为 %s\n" , buf);
        break;
    case 2:
        printf("请输入你的密码");
        scanf("%s" , buf);
        if (!strcmp( ptr->data.password , buf ))
        {
            printf("新密码不能和旧密码相同\n");
            return ;
        }
        strcpy( ptr->data.password ,  buf);
        printf("密码修改成功 密码为 %s\n" , buf);
        break;
    case 3:
        ptr->data.id = 1;
        printf("恭喜 \"%s\" 用户 成功升级为 svip\n" , ptr->data.name);
        break;
    default:
        break;
    }


}

void test_2(Double_Link_List * list1 , Double_Link_List * list2)
{
    // 插入数据
    insert_double_node( list1 , data[0] , 1 );
    insert_double_node( list1 , data[1] , 1 );
    insert_double_node( list1 , data[2] , 1 );

    // 修改
    root_amend( list1 , "雨龙" );
    Double_Node * we =find_double_node_name(list1, "雨龙");
    insert_double_node(list2, we->data , 2);
    delete_double_node(list1, 2);
    F_print( list1 , "2_dom_data.txt" );
    F_print( list2 , "1_root_data.txt" );

/*
1、找到 刘备
2、修改权限
3、将刘备的信息 插入到 管理员 链表中
4、将刘备的信息 从 普通用户中 删除
5、将普通用户 链表 和 管理员 链表 覆盖写入文件
*/
    // 遍历 
    print_forward_double_link_list(list1);
    
}

void test_1(void)
{
    // 对链表进行初始化
    Double_Link_List * dom_list = init_double_link_list();  // 普通用户 
    Double_Link_List * root_list = init_double_link_list(); // 管理员用户
    insert_double_node( root_list , data[3] , 1 );
    F_print( root_list , "1_root_data.txt" );
    // 数据的载入
    F_scanf( dom_list , "2_dom_data.txt" );
    F_scanf( root_list , "1_root_data.txt" );
    int num = 0;
    done:
    printf("1:进入登陆\t 2:进入注册");
    scanf("%d" , &num);

    switch (num)
    {
    case 1:
        log_in( dom_list , root_list );
        break;
    case 2:
        reg( dom_list );
        goto done; 
        break;
    default:
        break;
    }
    
    test_2(dom_list , root_list);
    // 释放链表
    free_double_link_list(&dom_list);
    free_double_link_list(&root_list);

}

int main ( int argc, char const * argv[] )
{
    test_1();
    return 0;
}